package juc.cyclicbarrier;

import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrier：
 * 让一组线程到达一个屏障时被阻塞，直到最后一个线程到达屏障时，屏障才会开门，所有被屏障拦截的线程才会继续干活。
 * 
 * CyclicBarrier与CountDownLatch的区别：
 * 		CyclicBarrier：允许一组线程相互等待，直到到达某个公共的屏障点，才会继续完成各自后续的任务（到达屏障点之后各自该干嘛干嘛）。
 * 		CountDownLatch：它允许一个线程在一组其他线程完成执行的动作之前一直等待，直到其他线程都执行完毕它才继续执行后面的动作。
 */
public class Test {

	/**
	 * 示例：团体游客一起检票进入公园
	 */
	public static void main(String[] args) throws InterruptedException {
		// 创建1个带有动作的CyclicBarrier
		CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
			// 第二个参数不是必须的，表示最后一个线程到达屏障时需要进行的动作

			public void run() {
				System.out.println(System.currentTimeMillis() + "\t 所有人都到齐了，可以开始检票进入公园了。" 
						+ "\t" + Thread.currentThread().getName());
			}
			
		});
		
		// 启动5个线程，模拟游客陆续到达公园门口
		new Visitor("zhangsan", cyclicBarrier).start();
		
		Thread.sleep(1000);
		
		new Visitor("lisi", cyclicBarrier).start();
		
		Thread.sleep(1000);
		
		new Visitor("导游", cyclicBarrier).start(); // 导游，手里持有本次游览公园的团体票
		
		Thread.sleep(1000);
		
		new Visitor("wangwu", cyclicBarrier).start();
		
		Thread.sleep(1000);
		
		new Visitor("zhaoliu", cyclicBarrier).start();
	}

}
